package enemies.strategy.concretes;

import mapControl.Celda;
import net.datastructures.Edge;
import net.datastructures.NodePositionList;
import net.datastructures.Vertex;
import ED.GraphImp;
import ED.MyVertex;
/**
 * Clase que modela una busqueda de caminos
 * @author Sebastian Giulietti 69032 
 * @author Adrian Sanchez 64251
 * 
 */
public class FindPathDFS<V, E> {
	
	//Objectos que representan el estado del nodo
	protected Object ESTADO = new Object();	
	protected Object NOVISITADO = new Object();
	protected Object VISITADO = new Object();
	
	//Grafo que representa al tablero
	private GraphImp<V, E> graph;
	
	//Lista que contiene el camino
	private NodePositionList<Vertex<V>> path;
	

	/**Contructor principal
	 * @param graph
	 */
	public FindPathDFS(GraphImp<V, E> graph) {
		this.graph = graph;

	}

	/**
	 *Setea todos los nodos como no visitados 
	 */
	private void limpiarGrafo() {
		for (Edge<E> e : graph.edges()) {
			e.put(ESTADO, NOVISITADO);
		}

	}

	/** Obtiene el camino
	 * @param origen origen 
	 * @return camino
	 */
	@SuppressWarnings("unchecked")
	public NodePositionList<Vertex<V>> obtenerCamino(Vertex<Celda> origen) {
		path = new NodePositionList<Vertex<V>>();
		limpiarGrafo();
		search((MyVertex<V, E>) origen);
		return path;
	}

	/** Ejecuta la busqueda exhaustiva
	 * @param origen orijen
	 */
	@SuppressWarnings("unchecked")
	private void search(MyVertex<V, E> origen) {
		origen.put(ESTADO, VISITADO);
		path.addLast(origen);

		for (Edge<E> camino : origen.getAdjacencyList()) {
			if (camino.get(ESTADO) == NOVISITADO) {
				camino.put(ESTADO, VISITADO);
				MyVertex<V, E> newOrigen = (MyVertex<V, E>) graph.opposite(
						origen, camino);
				search(newOrigen);
				path.addLast(origen);
			}

		}

	}

}
